﻿#pragma once

#include "Man.h"

// 游戏状态
typedef enum GameStatus {
    END,    // 已结束
    PLAYING // 游戏中
} GameStatus;

typedef struct MoveNode MoveNode;

// 移动结点
struct MoveNode {
    BaseGameObject* box;    // 被推动的箱子
    UINT direction;         // 移动方向
    MoveNode* previous;     // 前一个移动结点
};

typedef struct Game Game;

typedef void (*GameDelete)(Game*);
typedef void (*GameGotoLevel)(Game*, int);
typedef BOOL (*GameOnKeyPress)(Game*, UINT);
typedef void (*GameRestart)(Game*);
typedef void (*GameSelectLevel)(Game*);
typedef void (*GameUndo)(Game*);

// 游戏
struct Game {
    int mBoxCount;          // 未到达目的地的箱子数
    HWND mCallback;         // 回调
    HDC mDrawer;            // 绘图者
    HWND mGameBoard;        // 游戏区域
    int mLevel;             // 关卡数
    Man* mMan;              // 小人
    int mMoveCount;         // 移动次数
    MoveNode* mMoveList;    // 所有移动结点
    GameStatus mStatus;     // 状态

    GameDelete deleteSelf;
    GameGotoLevel gotoLevel;
    GameOnKeyPress onKeyPressed;
    GameRestart restart;
    GameUndo undo;
};

Game* New_Game(HWND, HDC, HWND);
